package JUC;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * @author 豆包LU
 * @date 2023/5/8 11:08
 */
public class ArrayBlockingQueueExample {
    public static void main(String[] args) {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);
        // 创建一个生产者线程，向队列中添加数据
        Thread producer = new Thread(() -> {
            try {
                queue.put(1); // 将数据添加到队列中，如果队列已满，则阻塞
                System.out.println("生产者生产数据：" + 1);
                queue.put(2); // 将数据添加到队列中，如果队列已满，则阻塞
                System.out.println("生产者生产数据：" + 2);
                queue.put(3); // 将数据添加到队列中，如果队列已满，则阻塞
                System.out.println("生产者生产数据：" + 3);
                queue.put(4); // 将数据添加到队列中，如果队列已满，则阻塞
                System.out.println("生产者生产数据：" + 4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 创建一个消费者线程，从队列中取走数据
        Thread consumer = new Thread(() -> {
            try {
                Thread.sleep(2000); // 等待2秒钟，让生产者线程先向队列中添加数据
                System.out.println("消费者消费数据：" + queue.take()); // 从队列中取走数据，如果队列为空，则阻塞
                System.out.println("消费者消费数据：" + queue.take()); // 从队列中取走数据，如果队列为空，则阻塞
                System.out.println("消费者消费数据：" + queue.take()); // 从队列中取走数据，如果队列为空，则阻塞
                System.out.println("消费者消费数据：" + queue.take()); // 从队列中取走数据，如果队列为空，则阻塞
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 启动生产者和消费者线程
        producer.start();
        consumer.start();

    }
}